home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / usenet / volume6 / sokoban < prev    next >
Encoding:
Internet Message Format  |  1989-01-03  |  59.6 KB

  1. Path: uunet!tektronix!tekgen!tekred!games
  2. From: games@tekred.TEK.COM
  3. Newsgroups: comp.sources.games
  4. Subject: v06i001:  sokoban - curses based, get the money game
  5. Message-ID: <3441@tekred.TEK.COM>
  6. Date: 3 Jan 89 20:53:15 GMT
  7. Sender: billr@tekred.TEK.COM
  8. Reply-To: "H.Bernau" <pyramid!tub!astbe!ber>
  9. Lines: 2282
  10. Approved: billr@saab.CNA.TEK.COM
  11.  
  12. Submitted by: "H.Bernau" <pyramid!tub!astbe!ber>
  13. Comp.sources.games: Volume 6, Issue 1
  14. Archive-name: sokoban
  15.  
  16.     [This started out like a simplified game of wanderer with an
  17.      easy screen 1.  Then up popped screen 2 - I still haven't
  18.      figured this one out.  -br]
  19.  
  20.     From the author:
  21.     [[Here comes one of my favourit games. There are no monsters,
  22.       no traps, no reason to die, no chance to win.  But as soon as
  23.       you play, it captures you.
  24.  
  25.        Feel free to reply
  26.        (Within Europe use astbe!ber)
  27.        (From elsewhere try to use ...!pyramid!tub!astbe!ber)]]
  28.  
  29. #! /bin/sh
  30. # This is a shell archive.  Remove anything before this line, then unpack
  31. # it by saving it into a file and typing "sh file".  To overwrite existing
  32. # files, type "sh file -c".  You can also feed this as standard input via
  33. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  34. # will see the following message at the end:
  35. #        "End of shell archive."
  36. # Contents:  README Makefile play.c readscreen.c save.c score.c
  37. #   showscreen.c sok.c sokoban.h sokoban.help screen.1 screen.10
  38. #   screen.11 screen.12 screen.13 screen.14 screen.15 screen.16
  39. #   screen.17 screen.18 screen.19 screen.2 screen.20 screen.21
  40. #   screen.22 screen.23 screen.24 screen.25 screen.26 screen.27
  41. #   screen.28 screen.29 screen.3 screen.30 screen.31 screen.32
  42. #   screen.33 screen.34 screen.35 screen.36 screen.37 screen.38
  43. #   screen.39 screen.4 screen.40 screen.41 screen.42 screen.5 screen.6
  44. #   screen.7 screen.8 screen.9
  45. # Wrapped by billr@saab on Tue Jan  3 12:13:05 1989
  46. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  47. if test -f 'README' -a "${1}" != "-c" ; then 
  48.   echo shar: Will not clobber existing file \"'README'\"
  49. else
  50. echo shar: Extracting \"'README'\" \(1607 characters\)
  51. sed "s/^X//" >'README' <<'END_OF_FILE'
  52. XThis is SOKOBAN.
  53. X
  54. XI saw this game first on a PC running MSDOS. I found the idea of the game so
  55. Xclever, that I made up my mind to make it run with an ascii terminal using
  56. Xcurses so that we can play it on our MicroVAX/ULTRIX. 
  57. X
  58. XAlong with this package there are alot of screen files describing the various
  59. Xplay levels. So what you need to do to install it on your own machine is:
  60. X
  61. X-   Edit the header file sokoban.h to alter the given defines
  62. X
  63. XYou have to note the following restrictions
  64. X
  65. X-   The screen files must be readable for everyone who should be able to play
  66. X    this game
  67. X-   The score file should have read/write permission only for the owner
  68. X    of the executable program. If you do so sokoban must run with setuid.
  69. X
  70. XYou can now compile it (just type 'make').
  71. XIf compilation is succesful you must initialize the score file (just type
  72. X'sokoban -c'). If you have forgotten the password, examine sokoban.h.
  73. X
  74. XThere is no manual page. All you have to know when you first play the game is
  75. Xthe command '?'. This gives you one screenful of information.
  76. X
  77. XAfter you have solved all the given screens (this will take a while) you will
  78. Xfind the game boring (sure you will). I hope there will be a lot of players who
  79. Xwill think out some new screens.
  80. XTo test your own screens copy them to the screen directory (with a new level
  81. Xnumber <nn>) and type sokoban -<nn>.
  82. X
  83. XPLEASE DO SO AND POST NEW SCREENS TO THE NET.
  84. XOTHERWISE IT GETS BORING !!!!!!!!!!!!!!!!!!!!
  85. X
  86. XComments are welcome.
  87. X
  88. XWithin Europe reply to astbe!ber
  89. X
  90. XFrom other continents try to use ...!pyramid!tub!astbe!ber
  91. X   (otherwise it would be expensive)
  92. END_OF_FILE
  93. if test 1607 -ne `wc -c <'README'`; then
  94.     echo shar: \"'README'\" unpacked with wrong size!
  95. fi
  96. # end of 'README'
  97. fi
  98. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  99.   echo shar: Will not clobber existing file \"'Makefile'\"
  100. else
  101. echo shar: Extracting \"'Makefile'\" \(477 characters\)
  102. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  103. XCCOPT= -g
  104. XOBJECTS= sok.o readscreen.o showscreen.o play.o save.o score.o
  105. X
  106. Xsokoban: $(OBJECTS)
  107. X    cc $(CCOPT) -o sokoban $(OBJECTS) -lcurses -ltermcap
  108. Xsok.o: sok.c sokoban.h
  109. X    cc $(CCOPT) -c sok.c
  110. X
  111. Xreadscreen.o: readscreen.c sokoban.h
  112. X    cc $(CCOPT) -c readscreen.c
  113. X
  114. Xshowscreen.o: showscreen.c sokoban.h
  115. X    cc $(CCOPT) -c showscreen.c
  116. X
  117. Xplay.o: play.c sokoban.h
  118. X    cc $(CCOPT) -c play.c
  119. X
  120. Xsave.o: save.c sokoban.h
  121. X    cc $(CCOPT) -c save.c
  122. X
  123. Xscore.o: score.c sokoban.h
  124. X    cc $(CCOPT) -c score.c
  125. END_OF_FILE
  126. if test 477 -ne `wc -c <'Makefile'`; then
  127.     echo shar: \"'Makefile'\" unpacked with wrong size!
  128. fi
  129. # end of 'Makefile'
  130. fi
  131. if test -f 'play.c' -a "${1}" != "-c" ; then 
  132.   echo shar: Will not clobber existing file \"'play.c'\"
  133. else
  134. echo shar: Extracting \"'play.c'\" \(6884 characters\)
  135. sed "s/^X//" >'play.c' <<'END_OF_FILE'
  136. X#include <stdio.h>
  137. X#include <ctype.h>
  138. X#include <curses.h>
  139. X#include "sokoban.h"
  140. X
  141. X/* defining the types of move */
  142. X#define MOVE         1
  143. X#define PUSH         2
  144. X#define SAVE         3
  145. X#define UNSAVE         4
  146. X#define STOREMOVE     5
  147. X#define STOREPUSH     6
  148. X
  149. X/* defines for control characters */
  150. X#define CNTL_L        '\014'
  151. X#define CNTL_K        '\013'
  152. X#define CNTL_H        '\010'
  153. X#define CNTL_J        '\012'
  154. X#define CNTL_R        '\022'
  155. X#define CNTL_U        '\025'
  156. X
  157. Xextern char map[MAXROW+1][MAXCOL+1];
  158. Xextern short rows, cols, level, moves, pushes, savepack, packets;
  159. Xextern short scorelevel, scoremoves, scorepushes;
  160. Xextern POS ppos;
  161. X
  162. XPOS tpos1, tpos2,    /* test positions: 1/2 pos. over/under/left/right */
  163. X    lastppos,        /* the last player position (for undo) */
  164. X    lasttpos1, lasttpos2; /* last test positions (for undo) */
  165. Xchar lppc, ltp1c, ltp2c;  /* the char for these positions (for undo) */
  166. Xshort action, lastaction;
  167. X
  168. Xchar tmp_map[MAXROW+1][MAXCOL+1];
  169. Xshort tmp_pushes, tmp_moves, tmp_savepack;
  170. XPOS tmp_ppos;
  171. X
  172. Xint play() {
  173. X
  174. X   short c;
  175. X   short ret;
  176. X   short testmove();
  177. X   short undolock = 1;        /* locked for undo */
  178. X
  179. X   showscreen();
  180. X   tmpsave();
  181. X   ret = 0;
  182. X   while( ret == 0) {
  183. X      switch( (c = getchar())) {
  184. X     case 'q':    /* quit the game                     */
  185. X                  ret = E_ENDGAME; 
  186. X                  break;
  187. X     case 's':    /* save the games                    */
  188. X              if( (ret = savegame()) == 0)
  189. X             ret = E_SAVED;
  190. X              break;
  191. X     case '?':    /* show the help file                */
  192. X              showhelp();
  193. X              showscreen();
  194. X              break;
  195. X     case CNTL_R: /* refresh the screen                 */
  196. X              clear();
  197. X              showscreen();
  198. X              break;
  199. X     case 'c':    /* temporary save                    */
  200. X              tmpsave();
  201. X              break;
  202. X     case CNTL_U: /* reset to temporary save             */
  203. X              tmpreset();
  204. X              undolock = 1;
  205. X              showscreen();
  206. X              break;
  207. X     case 'U':    /* undo this level                 */
  208. X              moves = pushes = 0;
  209. X              if( (ret = readscreen()) == 0) {
  210. X                 showscreen();
  211. X             undolock = 1;
  212. X              }
  213. X              break;
  214. X     case 'u':    /* undo last move                 */
  215. X              if( ! undolock) {
  216. X                 undomove();
  217. X                 undolock = 1;
  218. X              }
  219. X              break;
  220. X     case 'k':    /* up                         */
  221. X     case 'K':    /* run up                     */
  222. X     case CNTL_K: /* run up, stop before object             */
  223. X     case 'j':    /* down                         */
  224. X     case 'J':    /* run down                     */
  225. X     case CNTL_J: /* run down, stop before object             */
  226. X     case 'l':    /* right                         */
  227. X     case 'L':    /* run right                     */
  228. X     case CNTL_L: /* run right, stop before object             */
  229. X     case 'h':    /* left                         */
  230. X     case 'H':    /* run left                     */
  231. X     case CNTL_H: /* run left, stop before object             */
  232. X              do {
  233. X                 if( (action = testmove( c)) != 0) {
  234. X                lastaction = action;
  235. X                    lastppos.x = ppos.x; lastppos.y = ppos.y;
  236. X                    lppc = map[ppos.x][ppos.y];
  237. X                    lasttpos1.x = tpos1.x; lasttpos1.y = tpos1.y; 
  238. X                    ltp1c = map[tpos1.x][tpos1.y];
  239. X                    lasttpos2.x = tpos2.x; lasttpos2.y = tpos2.y; 
  240. X                    ltp2c = map[tpos2.x][tpos2.y];
  241. X                    domove( lastaction); 
  242. X                    undolock = 0;
  243. X                 }
  244. X              } while( (action != 0) && (! islower( c))
  245. X                  && (packets != savepack));
  246. X              break;
  247. X     default:     helpmessage(); break;
  248. X      }
  249. X      if( (ret == 0) && (packets == savepack)) {
  250. X     scorelevel = level;
  251. X     scoremoves = moves;
  252. X     scorepushes = pushes;
  253. X     break;
  254. X      }
  255. X   }
  256. X   return( ret);
  257. X}
  258. X
  259. Xshort testmove( action)
  260. Xshort action;
  261. X{
  262. X   short ret;
  263. X   char tc;
  264. X   short stop_at_object;
  265. X
  266. X   if( (stop_at_object = iscntrl( action))) action = action + 'A' - 1;
  267. X   action = (isupper(action) ? tolower( action) : action);
  268. X   if( (action == 'k') || (action == 'j')) {
  269. X      tpos1.x = (action == 'k') ? ppos.x-1 : ppos.x+1;
  270. X      tpos2.x = (action == 'k') ? ppos.x-2 : ppos.x+2;
  271. X      tpos1.y = tpos2.y = ppos.y;
  272. X   }
  273. X   else {
  274. X      tpos1.y = (action == 'h') ? ppos.y-1 : ppos.y+1;
  275. X      tpos2.y = (action == 'h') ? ppos.y-2 : ppos.y+2;
  276. X      tpos1.x = tpos2.x = ppos.x;
  277. X   }
  278. X   tc = map[tpos1.x][tpos1.y];
  279. X   switch( tc) {
  280. X      case C_PACKET:
  281. X      case C_SAVE:   if( ! stop_at_object) {
  282. X            if( map[tpos2.x][tpos2.y] == C_GROUND)
  283. X               ret = (tc == C_SAVE) ? UNSAVE : PUSH;
  284. X                        else if( map[tpos2.x][tpos2.y] == C_STORE)
  285. X               ret = (tc == C_SAVE) ? STOREPUSH : SAVE;
  286. X                else ret = 0;
  287. X             }
  288. X             else ret = 0;                     break;
  289. X      case C_GROUND: ret = MOVE;                     break;
  290. X      case C_STORE:  ret = STOREMOVE;                     break;
  291. X      default:       ret = 0;                         break;
  292. X   }
  293. X   return( ret);
  294. X}
  295. X
  296. Xdomove( moveaction) 
  297. Xshort moveaction;
  298. X{
  299. X   map[ppos.x][ppos.y] = (map[ppos.x][ppos.y] == C_PLAYER) 
  300. X                   ? C_GROUND 
  301. X                   : C_STORE;
  302. X   switch( moveaction) {
  303. X      case MOVE:      map[tpos1.x][tpos1.y] = C_PLAYER;         break;
  304. X      case STOREMOVE: map[tpos1.x][tpos1.y] = C_PLAYERSTORE;         break;
  305. X      case PUSH:      map[tpos2.x][tpos2.y] = map[tpos1.x][tpos1.y];
  306. X              map[tpos1.x][tpos1.y] = C_PLAYER;    
  307. X              pushes++;                        break;
  308. X      case UNSAVE:    map[tpos2.x][tpos2.y] = C_PACKET;
  309. X              map[tpos1.x][tpos1.y] = C_PLAYERSTORE;        
  310. X              pushes++; savepack--;                 break;
  311. X      case SAVE:      map[tpos2.x][tpos2.y] = C_SAVE;
  312. X              map[tpos1.x][tpos1.y] = C_PLAYER;            
  313. X              savepack++; pushes++;                break;
  314. X      case STOREPUSH: map[tpos2.x][tpos2.y] = C_SAVE;
  315. X              map[tpos1.x][tpos1.y] = C_PLAYERSTORE;        
  316. X              pushes++;                        break;
  317. X   }
  318. X   moves++;
  319. X   dispmoves(); disppushes(); dispsave();
  320. X   mapchar( map[ppos.x][ppos.y], ppos.x, ppos.y);
  321. X   mapchar( map[tpos1.x][tpos1.y], tpos1.x, tpos1.y);
  322. X   mapchar( map[tpos2.x][tpos2.y], tpos2.x, tpos2.y);
  323. X   move( MAXROW+1, 0);
  324. X   refresh();
  325. X   ppos.x = tpos1.x; ppos.y = tpos1.y;
  326. X}
  327. X
  328. Xundomove() {
  329. X
  330. X   map[lastppos.x][lastppos.y] = lppc;
  331. X   map[lasttpos1.x][lasttpos1.y] = ltp1c;
  332. X   map[lasttpos2.x][lasttpos2.y] = ltp2c;
  333. X   ppos.x = lastppos.x; ppos.y = lastppos.y;
  334. X   switch( lastaction) {
  335. X      case MOVE:      moves--;                break;
  336. X      case STOREMOVE: moves--;                break;
  337. X      case PUSH:      moves--; pushes--;        break;
  338. X      case UNSAVE:    moves--; pushes--; savepack++;    break;
  339. X      case SAVE:      moves--; pushes--; savepack--;    break;
  340. X      case STOREPUSH: moves--; pushes--;        break;
  341. X   }
  342. X   dispmoves(); disppushes(); dispsave();
  343. X   mapchar( map[ppos.x][ppos.y], ppos.x, ppos.y);
  344. X   mapchar( map[lasttpos1.x][lasttpos1.y], lasttpos1.x, lasttpos1.y);
  345. X   mapchar( map[lasttpos2.x][lasttpos2.y], lasttpos2.x, lasttpos2.y);
  346. X   move( MAXROW+1, 0);
  347. X   refresh();
  348. X}
  349. X
  350. Xtmpsave() {
  351. X
  352. X   short i, j;
  353. X
  354. X   for( i = 0; i < rows; i++) for( j = 0; j < cols; j++)
  355. X      tmp_map[i][j] = map[i][j];
  356. X   tmp_pushes = pushes;
  357. X   tmp_moves = moves;
  358. X   tmp_savepack = savepack;
  359. X   tmp_ppos.x = ppos.x; tmp_ppos.y = ppos.y;
  360. X}
  361. X
  362. Xtmpreset() {
  363. X
  364. X   short i, j;
  365. X
  366. X   for( i = 0; i < rows; i++) for( j = 0; j < cols; j++)
  367. X      map[i][j] = tmp_map[i][j];
  368. X   pushes = tmp_pushes;
  369. X   moves = tmp_moves;
  370. X   savepack = tmp_savepack;
  371. X   ppos.x = tmp_ppos.x; ppos.y = tmp_ppos.y;
  372. X}
  373. END_OF_FILE
  374. if test 6884 -ne `wc -c <'play.c'`; then
  375.     echo shar: \"'play.c'\" unpacked with wrong size!
  376. fi
  377. # end of 'play.c'
  378. fi
  379. if test -f 'readscreen.c' -a "${1}" != "-c" ; then 
  380.   echo shar: Will not clobber existing file \"'readscreen.c'\"
  381. else
  382. echo shar: Extracting \"'readscreen.c'\" \(1364 characters\)
  383. sed "s/^X//" >'readscreen.c' <<'END_OF_FILE'
  384. X#include <stdio.h>
  385. X#include "sokoban.h"
  386. X
  387. Xextern short level, packets, savepack, rows, cols;
  388. Xextern char map[MAXROW+1][MAXCOL+1];
  389. Xextern POS ppos;
  390. X
  391. Xreadscreen() 
  392. X{
  393. X   FILE *screen;
  394. X   char *fnam;
  395. X   short j, c, ret = 0;
  396. X
  397. X   fnam = malloc( strlen( SCREENPATH) + 11);
  398. X   sprintf( fnam, "%s/screen.%d", SCREENPATH, level);
  399. X   if( (screen = fopen( fnam, "r")) == NULL) 
  400. X      ret = E_FOPENSCREEN;
  401. X   else {
  402. X      packets = savepack = rows = j = cols  = 0;
  403. X      storepos( ppos, -1, -1);
  404. X      while( (ret == 0) && ((c = getc( screen)) != EOF)) {
  405. X         switch( c) {
  406. X        case '\n':     map[rows++][j] = '\0';
  407. X               if( rows > MAXROW) 
  408. X                  ret = E_TOMUCHROWS;
  409. X               else {
  410. X                  if( j > cols) cols = j;
  411. X                  j = 0;
  412. X               }
  413. X               break;
  414. X        case C_PLAYERSTORE:
  415. X        case C_PLAYER: if( ppos.x != -1) 
  416. X                  ret = E_PLAYPOS1;
  417. X                       else { 
  418. X                      storepos( ppos, rows, j); 
  419. X                  map[rows][j++] = c;
  420. X                  if( j > MAXCOL) ret = E_TOMUCHCOLS;
  421. X               }
  422. X                       break;
  423. X        case C_SAVE:   savepack++;
  424. X        case C_PACKET: packets++;
  425. X        case C_WALL:
  426. X        case C_STORE:
  427. X        case C_GROUND: map[rows][j++] = c;
  428. X               if( j > MAXCOL) ret = E_TOMUCHCOLS;
  429. X               break;
  430. X        default:       ret = E_ILLCHAR;
  431. X     }
  432. X      }
  433. X      fclose( screen);
  434. X      if( (ret == 0) && (ppos.x == -1)) ret = E_PLAYPOS2;
  435. X   }
  436. X   return( ret);
  437. X}
  438. END_OF_FILE
  439. if test 1364 -ne `wc -c <'readscreen.c'`; then
  440.     echo shar: \"'readscreen.c'\" unpacked with wrong size!
  441. fi
  442. # end of 'readscreen.c'
  443. fi
  444. if test -f 'save.c' -a "${1}" != "-c" ; then 
  445.   echo shar: Will not clobber existing file \"'save.c'\"
  446. else
  447. echo shar: Extracting \"'save.c'\" \(3405 characters\)
  448. sed "s/^X//" >'save.c' <<'END_OF_FILE'
  449. X#include <stdio.h>
  450. X#include <sys/types.h>
  451. X#include <sys/stat.h>
  452. X#include <signal.h>
  453. X#include "sokoban.h"
  454. X
  455. Xextern char *username;
  456. Xextern char map[MAXROW+1][MAXCOL+1];
  457. Xextern short level, moves, pushes, packets, savepack, rows, cols;
  458. Xextern POS ppos;
  459. X
  460. Xlong  savedbn;
  461. Xchar *sfname;
  462. XFILE *savefile;
  463. Xstruct stat sfstat;
  464. X
  465. Xshort savegame() {
  466. X
  467. X   short ret = 0;
  468. X
  469. X   signal( SIGINT, SIG_IGN);
  470. X   sfname = malloc( strlen( SAVEPATH) + strlen( username) + 5);
  471. X   sprintf( sfname, "%s/%s.sav", SAVEPATH, username);
  472. X   if( (savefile = fopen( sfname, "w")) == NULL)
  473. X      ret = E_FOPENSAVE;
  474. X   else {
  475. X      savedbn = fileno( savefile);
  476. X      if( write( savedbn, &(map[0][0]), MAXROW*MAXCOL) != MAXROW*MAXCOL)
  477. X     ret = E_WRITESAVE;
  478. X      else if( write( savedbn, &ppos, sizeof( POS)) != sizeof( POS))     
  479. X     ret = E_WRITESAVE;
  480. X      else if( write( savedbn, &level, 2) != 2)    ret = E_WRITESAVE;
  481. X      else if( write( savedbn, &moves, 2) != 2)    ret = E_WRITESAVE;
  482. X      else if( write( savedbn, &pushes, 2) != 2)   ret = E_WRITESAVE;
  483. X      else if( write( savedbn, &packets, 2) != 2)  ret = E_WRITESAVE;
  484. X      else if( write( savedbn, &savepack, 2) != 2) ret = E_WRITESAVE;
  485. X      else if( write( savedbn, &rows, 2) != 2)     ret = E_WRITESAVE;
  486. X      else if( write( savedbn, &cols, 2) != 2)     ret = E_WRITESAVE;
  487. X      else {
  488. X     fclose( savefile);
  489. X     if( stat( sfname, &sfstat) != 0) ret = E_STATSAVE;
  490. X     else if( (savefile = fopen( sfname, "a")) == NULL)
  491. X            ret = E_FOPENSAVE;
  492. X         else {
  493. X        if( write( savedbn, &sfstat, sizeof( sfstat)) != sizeof( sfstat))
  494. X           ret = E_WRITESAVE;
  495. X        fclose( savefile);
  496. X     }
  497. X      }
  498. X   }
  499. X   if( (ret == E_WRITESAVE) || (ret == E_STATSAVE)) unlink( sfname);
  500. X   signal( SIGINT, SIG_DFL);
  501. X
  502. X   return( ret);
  503. X}
  504. X
  505. Xshort restoregame() {
  506. X
  507. X   short ret = 0;
  508. X   struct stat oldsfstat;
  509. X
  510. X   signal( SIGINT, SIG_IGN);
  511. X   sfname = malloc( strlen( SAVEPATH) + strlen( username) + 5);
  512. X   sprintf( sfname, "%s/%s.sav", SAVEPATH, username);
  513. X   if( stat( sfname, &oldsfstat) < -1) 
  514. X      ret = E_NOSAVEFILE;
  515. X   else {
  516. X      if( (savefile = fopen( sfname, "r")) == NULL)
  517. X     ret = E_FOPENSAVE;
  518. X      else {
  519. X         savedbn = fileno( savefile);
  520. X         if( read( savedbn, &(map[0][0]), MAXROW*MAXCOL) != MAXROW*MAXCOL)
  521. X        ret = E_READSAVE;
  522. X         else if( read( savedbn, &ppos, sizeof( POS)) != sizeof( POS))     
  523. X        ret = E_READSAVE;
  524. X         else if( read( savedbn, &level, 2) != 2)    ret = E_READSAVE;
  525. X         else if( read( savedbn, &moves, 2) != 2)    ret = E_READSAVE;
  526. X         else if( read( savedbn, &pushes, 2) != 2)   ret = E_READSAVE;
  527. X         else if( read( savedbn, &packets, 2) != 2)  ret = E_READSAVE;
  528. X         else if( read( savedbn, &savepack, 2) != 2) ret = E_READSAVE;
  529. X         else if( read( savedbn, &rows, 2) != 2)     ret = E_READSAVE;
  530. X         else if( read( savedbn, &cols, 2) != 2)     ret = E_READSAVE;
  531. X     else if( read( savedbn, &sfstat, sizeof( sfstat)) != sizeof( sfstat))
  532. X        ret = E_READSAVE;
  533. X     else if( (sfstat.st_dev != oldsfstat.st_dev) ||
  534. X                  (sfstat.st_ino != oldsfstat.st_ino) ||
  535. X                  (sfstat.st_nlink != oldsfstat.st_nlink) ||
  536. X                  (sfstat.st_uid != oldsfstat.st_uid) ||
  537. X                  (sfstat.st_gid != oldsfstat.st_gid) ||
  538. X                  (sfstat.st_mtime != oldsfstat.st_mtime))
  539. X            ret = E_ALTERSAVE;
  540. X      }
  541. X      unlink( sfname);
  542. X   }
  543. X   signal( SIGINT, SIG_DFL);
  544. X   return( ret);
  545. X}
  546. END_OF_FILE
  547. if test 3405 -ne `wc -c <'save.c'`; then
  548.     echo shar: \"'save.c'\" unpacked with wrong size!
  549. fi
  550. # end of 'save.c'
  551. fi
  552. if test -f 'score.c' -a "${1}" != "-c" ; then 
  553.   echo shar: Will not clobber existing file \"'score.c'\"
  554. else
  555. echo shar: Extracting \"'score.c'\" \(4947 characters\)
  556. sed "s/^X//" >'score.c' <<'END_OF_FILE'
  557. X#include <stdio.h>
  558. X#include <signal.h>
  559. X#include "sokoban.h"
  560. X
  561. Xextern char *username;
  562. Xextern short scorelevel, scoremoves, scorepushes;
  563. X
  564. Xshort scoreentries;
  565. Xstruct {
  566. X   char user[MAXUSERNAME];
  567. X   short lv, mv, ps;
  568. X} scoretable[MAXSCOREENTRIES];
  569. X
  570. XFILE *scorefile;
  571. Xlong sfdbn;
  572. X
  573. Xshort outputscore() {
  574. X
  575. X   short ret;
  576. X
  577. X   while( creat( LOCKFILE) < 0);    /* lock the score file */
  578. X   if( (ret = readscore()) == 0)
  579. X      showscore();
  580. X   unlink( LOCKFILE);
  581. X   return( (ret == 0) ? E_ENDGAME : ret);
  582. X}
  583. X
  584. Xshort makenewscore() {
  585. X
  586. X   short ret = 0;
  587. X
  588. X   while( creat( LOCKFILE) < 0) ;
  589. X   scoreentries = 0;
  590. X   if( (scorefile = fopen( SCOREFILE, "w")) == NULL)
  591. X      ret = E_FOPENSCORE;
  592. X   else {
  593. X      sfdbn = fileno( scorefile);
  594. X      write( sfdbn, &scoreentries, 2);
  595. X      fclose( scorefile);
  596. X   }
  597. X   unlink( LOCKFILE);
  598. X   return( (ret == 0) ? E_ENDGAME : ret);
  599. X}
  600. X
  601. Xshort getuserlevel( lv)
  602. Xshort *lv;
  603. X{
  604. X   short ret = 0, pos;
  605. X
  606. X   while( creat( LOCKFILE) < 0);
  607. X   if( (scorefile = fopen( SCOREFILE, "r")) == NULL)
  608. X      ret = E_FOPENSCORE;
  609. X   else {
  610. X      if( (ret = readscore()) == 0)
  611. X     *lv = ( (pos = finduser()) > -1) ? scoretable[pos].lv+1 : 1;
  612. X   }
  613. X   unlink( LOCKFILE);
  614. X   return( ret);
  615. X}
  616. X
  617. Xshort score() {
  618. X   
  619. X   short ret;
  620. X
  621. X   while( creat( LOCKFILE) < 0);    /* lock the score file */
  622. X   if( (ret = readscore()) == 0)
  623. X      if( (ret = makescore()) == 0)
  624. X     if( (ret = writescore()) == 0)
  625. X        showscore();
  626. X   unlink( LOCKFILE);
  627. X   return( (ret == 0) ? E_ENDGAME : ret);
  628. X}
  629. X
  630. Xreadscore() {
  631. X
  632. X   short ret = 0;
  633. X   long tmp;
  634. X
  635. X   if( (scorefile = fopen( SCOREFILE, "r")) == NULL)
  636. X      ret = E_FOPENSCORE;
  637. X   else {
  638. X      sfdbn = fileno( scorefile);
  639. X      if( read( sfdbn, &scoreentries, 2) != 2) ret = E_READSCORE;
  640. X      else {
  641. X     tmp = scoreentries * sizeof( scoretable[0]);
  642. X     if( read( sfdbn, &(scoretable[0]), tmp) != tmp) ret = E_READSCORE;
  643. X      }
  644. X      fclose( scorefile);
  645. X   }
  646. X   return( ret);
  647. X}
  648. X
  649. Xmakescore() {
  650. X
  651. X   short ret = 0, pos, i, build = 1, insert;
  652. X
  653. X   if( (pos = finduser()) > -1) {    /* user already in score file */
  654. X      insert =    (scorelevel > scoretable[pos].lv)
  655. X           || ( (scorelevel == scoretable[pos].lv) &&
  656. X                    (scoremoves < scoretable[pos].mv)
  657. X          )
  658. X           || ( (scorelevel == scoretable[pos].lv) &&
  659. X            (scoremoves == scoretable[pos].mv) &&
  660. X            (scorepushes < scoretable[pos].ps)
  661. X          );
  662. X      if( insert) {             /* delete existing entry */
  663. X     for( i = pos; i < scoreentries-1; i++)
  664. X        cp_entry( i, i+1);
  665. X     scoreentries--;
  666. X      }
  667. X      else build = 0;
  668. X   }
  669. X   else if( scoreentries == MAXSCOREENTRIES)
  670. X      ret = E_TOMUCHSE;
  671. X   if( (ret == 0) && build) {
  672. X      pos = findpos();            /* find the new score position */
  673. X      if( pos > -1) {            /* score table not empty */
  674. X     for( i = scoreentries; i > pos; i--)
  675. X        cp_entry( i, i-1);
  676. X      }
  677. X      else pos = scoreentries;
  678. X
  679. X      strcpy( scoretable[pos].user, username);
  680. X      scoretable[pos].lv = scorelevel;
  681. X      scoretable[pos].mv = scoremoves;
  682. X      scoretable[pos].ps = scorepushes;
  683. X      scoreentries++;
  684. X   }
  685. X   return( ret);
  686. X}
  687. X
  688. Xfinduser() {
  689. X
  690. X   short i, found;
  691. X
  692. X   for( i = 0; (i < scoreentries) && (! found); i++)
  693. X      found = (strcmp( scoretable[i].user, username) == 0);
  694. X   return( (found) ? i-1 : -1);
  695. X}
  696. X
  697. Xfindpos() {
  698. X   short i, found;
  699. X
  700. X   for( i = 0; (i < scoreentries) && (! found); i++)
  701. X      found =    (scorelevel > scoretable[i].lv)
  702. X          || ( (scorelevel == scoretable[i].lv) &&
  703. X                   (scoremoves < scoretable[i].mv)
  704. X         )
  705. X          || ( (scorelevel == scoretable[i].lv) &&
  706. X           (scoremoves == scoretable[i].mv) &&
  707. X           (scorepushes < scoretable[i].ps)
  708. X         );
  709. X   return( (found) ? i-1 : -1);
  710. X}
  711. X
  712. Xwritescore() {
  713. X
  714. X   short ret = 0;
  715. X   long tmp;
  716. X
  717. X   if( (scorefile = fopen( SCOREFILE, "w")) == NULL)
  718. X      ret = E_FOPENSCORE;
  719. X   else {
  720. X      sfdbn = fileno( scorefile);
  721. X      if( write( sfdbn, &scoreentries, 2) != 2) ret = E_WRITESCORE;
  722. X      else {
  723. X     tmp = scoreentries * sizeof( scoretable[0]);
  724. X     if( write( sfdbn, &(scoretable[0]), tmp) != tmp) ret = E_WRITESCORE;
  725. X      }
  726. X      fclose( scorefile);
  727. X   }
  728. X   return( ret);
  729. X}
  730. X
  731. Xshowscore() {
  732. X
  733. X   short lastlv = 0, lastmv, lastps, i;
  734. X
  735. X   fprintf( stdout, "Rank        User       Level       Moves      Pushes\n");
  736. X   fprintf( stdout, "====================================================\n");
  737. X   for( i = 0; i < scoreentries; i++) {
  738. X      if( (scoretable[i].lv == lastlv)&& 
  739. X      (scoretable[i].mv == lastmv) && 
  740. X      (scoretable[i].ps == lastps))
  741. X     fprintf( stdout, "      ");
  742. X      else {
  743. X         lastlv = scoretable[i].lv;
  744. X         lastmv = scoretable[i].mv;
  745. X         lastps = scoretable[i].ps;
  746. X         fprintf( stdout, "%4d  ", i+1);
  747. X      }
  748. X      fprintf( stdout, "%10s  %10d  %10d  %10d\n", scoretable[i].user, 
  749. X        scoretable[i].lv, scoretable[i].mv, scoretable[i].ps);
  750. X   }
  751. X}
  752. X
  753. Xcp_entry( i1, i2)
  754. Xshort i1, i2;
  755. X{
  756. X   strcpy( scoretable[i1].user, scoretable[i2].user);
  757. X   scoretable[i1].lv = scoretable[i2].lv;
  758. X   scoretable[i1].mv = scoretable[i2].mv;
  759. X   scoretable[i1].ps = scoretable[i2].ps;
  760. X}
  761. END_OF_FILE
  762. if test 4947 -ne `wc -c <'score.c'`; then
  763.     echo shar: \"'score.c'\" unpacked with wrong size!
  764. fi
  765. # end of 'score.c'
  766. fi
  767. if test -f 'showscreen.c' -a "${1}" != "-c" ; then 
  768.   echo shar: Will not clobber existing file \"'showscreen.c'\"
  769. else
  770. echo shar: Extracting \"'showscreen.c'\" \(2273 characters\)
  771. sed "s/^X//" >'showscreen.c' <<'END_OF_FILE'
  772. X#include <curses.h>
  773. X#include "sokoban.h"
  774. X
  775. Xextern short rows, cols, level, moves, pushes, packets, savepack;
  776. Xextern char map[MAXROW+1][MAXCOL+1];
  777. X
  778. Xshowscreen() {
  779. X
  780. X   short i, j;
  781. X
  782. X   move( 0, 0); clrtobot();
  783. X   for( i = 0; i < rows; i++)
  784. X      for( j = 0; map[i][j] != '\0'; j++)
  785. X         mapchar( map[i][j], i, j);
  786. X   move( MAXROW, 0);
  787. X   printw( "Level:      Packets:      Saved:      Moves:             Pushes:");
  788. X   displevel();
  789. X   disppackets();
  790. X   dispsave();
  791. X   dispmoves();
  792. X   disppushes();
  793. X   move( MAXROW+2,0);
  794. X   refresh();
  795. X}
  796. X
  797. Xmapchar( c, i, j) 
  798. Xchar c; 
  799. Xshort i, j;
  800. X{
  801. X   short offset_row = (MAXROW - rows) / 2;
  802. X   short offset_col = MAXCOL - cols;
  803. X
  804. X   move( i + offset_row, 2*j + offset_col);     addch( c);
  805. X   move( i + offset_row, 2*j + 1 + offset_col); addch( c);
  806. X}
  807. X
  808. Xdisplevel() { 
  809. X   move( MAXROW, 7); printw( "%3d", level); 
  810. X}
  811. X   
  812. Xdisppackets() { 
  813. X   move( MAXROW, 21); printw( "%3d", packets); 
  814. X}
  815. X   
  816. Xdispsave() { 
  817. X   move( MAXROW, 33); printw( "%3d", savepack); 
  818. X}
  819. X   
  820. Xdispmoves() { 
  821. X   move( MAXROW, 45); printw( "%10d", moves); 
  822. X}
  823. X      
  824. Xdisppushes() { 
  825. X   move( MAXROW, 65); printw( "%10d", pushes); 
  826. X}
  827. X
  828. Xhelpmessage() {
  829. X   move( MAXROW+2, 0); printw( "Press ? for help.%c", '\007');
  830. X   refresh();
  831. X   raw();                /* no input allowed while sleeping */
  832. X   sleep( 2);
  833. X   move( MAXROW+2, 0); deleteln();
  834. X   refresh();
  835. X   noraw();                /* end raw mode */
  836. X}
  837. X
  838. Xshowhelp() {
  839. X
  840. X   FILE *helpfile;
  841. X   char buf[80];
  842. X   short i, ret = 0, endhelp = 0, c;
  843. X
  844. X   if( (helpfile = fopen( HELPFILE, "r")) == NULL)
  845. X      ret = E_FOPENHELP;
  846. X   else {
  847. X      raw();
  848. X      move( 0, 0); clrtobot();
  849. X      i = 0;
  850. X      while( fgets( buf, 80, helpfile) && (! endhelp)) {
  851. X     if( strncmp( buf, "+=", 2) == 0) {        /* page eject */
  852. X        move( 23, 0);
  853. X        addstr( "(Press space to continue, return to exit help)");
  854. X        refresh();
  855. X        noraw();
  856. X        if( (c = getchar()) == '\n') 
  857. X           endhelp = 1;
  858. X        else {
  859. X           i = 0;
  860. X           move( 0, 0); clrtobot();
  861. X           refresh();
  862. X           raw();
  863. X        }
  864. X     }
  865. X     else if( strncmp( buf, "==", 2) == 0) {    /* end of helpfile */
  866. X        move( 23, 0);
  867. X        addstr( "(Press any key to continue)");
  868. X        refresh();
  869. X        noraw();
  870. X        getchar();
  871. X        endhelp = 1;
  872. X     }
  873. X     else {
  874. X        move( i, 0);
  875. X        addstr( buf);
  876. X        i++;
  877. X     }
  878. X      }
  879. X   }
  880. X   return( ret);
  881. X}
  882. END_OF_FILE
  883. if test 2273 -ne `wc -c <'showscreen.c'`; then
  884.     echo shar: \"'showscreen.c'\" unpacked with wrong size!
  885. fi
  886. # end of 'showscreen.c'
  887. fi
  888. if test -f 'sok.c' -a "${1}" != "-c" ; then 
  889.   echo shar: Will not clobber existing file \"'sok.c'\"
  890. else
  891. echo shar: Extracting \"'sok.c'\" \(4668 characters\)
  892. sed "s/^X//" >'sok.c' <<'END_OF_FILE'
  893. X#include <stdio.h>
  894. X#include <curses.h>
  895. X#include "sokoban.h"
  896. X
  897. Xshort level, packets, savepack, moves, pushes, rows, cols;
  898. Xshort scorelevel, scoremoves, scorepushes;
  899. Xchar  map[MAXROW+1][MAXCOL+1];
  900. XPOS   ppos;
  901. Xchar  *username, *prgname;
  902. X
  903. Xshort optshowscore = 0, optmakescore = 0, optrestore = 0, optlevel = 0; 
  904. Xshort scoring = 1, superuser = 0;
  905. Xshort userlevel;
  906. X
  907. Xmain( argc, argv) 
  908. Xshort argc; 
  909. Xchar *argv[];
  910. X{
  911. X   short ret, ret2;
  912. X   char *strrchr(), *getlogin();
  913. X
  914. X   scorelevel = 0;
  915. X   moves = pushes = packets = savepack = 0;
  916. X   if( (prgname = strrchr( argv[0], '/')) == NULL)
  917. X      prgname = argv[0];
  918. X   else prgname++;
  919. X   if( (username = getlogin("SOKNAM")) == NULL)
  920. X      ret = E_NOUSER;
  921. X   else {
  922. X      superuser = (strcmp( username, SUPERUSER) == 0);
  923. X      if( (ret = checkcmdline( argc, argv)) == 0) {
  924. X         if( optshowscore)
  925. X        ret = outputscore();
  926. X         else if( optmakescore) {
  927. X        if( superuser) {
  928. X           if( (ret = getpassword()) == 0)
  929. X              ret = makenewscore();
  930. X        }
  931. X        else ret = E_NOSUPER;
  932. X     }
  933. X     else if( optrestore) {
  934. X        ret = restoregame();
  935. X     }
  936. X         else if( (ret = getuserlevel( &userlevel)) == 0) {
  937. X            if( optlevel > 0) {
  938. X           if( superuser) {
  939. X              level = optlevel;
  940. X          scoring = 0;
  941. X           }
  942. X           else if( userlevel < optlevel)
  943. X              ret = E_LEVELTOOHIGH;
  944. X           else level = optlevel;
  945. X        }
  946. X        else level = userlevel;
  947. X         }
  948. X      }
  949. X   }
  950. X   if( ret == 0)
  951. X      ret = gameloop();
  952. X   errmess( ret);
  953. X   if( scorelevel && scoring) {
  954. X      ret2 = score();
  955. X      errmess( ret2);
  956. X   }
  957. X   exit( ret);
  958. X}
  959. X
  960. Xcheckcmdline( argc, argv) 
  961. Xshort argc; 
  962. Xchar *argv[];
  963. X{
  964. X   short ret = 0;
  965. X
  966. X   if( argc > 1)
  967. X      if( (argc == 2) && (argv[1][0] == '-')) {
  968. X     if( (argv[1][1] == 's') && (argv[1][2] == '\0'))
  969. X        optshowscore = 1;
  970. X     else if( (argv[1][1] == 'c') && (argv[1][2] == '\0'))
  971. X        optmakescore = 1;
  972. X     else if( (argv[1][1] == 'r') && (argv[1][2] == '\0'))
  973. X        optrestore = 1;
  974. X     else if( (optlevel = atoi( &(argv[1][1]))) == 0)
  975. X        ret = E_USAGE;
  976. X      }
  977. X      else ret = E_USAGE;
  978. X   return( ret);
  979. X}
  980. X
  981. Xgameloop() {
  982. X
  983. X   short ret = 0;
  984. X
  985. X   initscr(); crmode(); noecho();
  986. X   if( ! optrestore) ret = readscreen();
  987. X   while( ret == 0) {
  988. X      if( (ret = play()) == 0) {
  989. X         level++;
  990. X         moves = pushes = packets = savepack = 0;
  991. X         ret = readscreen();
  992. X      }
  993. X   }
  994. X   move( 0, 0); clrtobot(); refresh(); 
  995. X   nocrmode(); echo(); erase(); endwin();
  996. X   return( ret);
  997. X}
  998. X
  999. Xgetpassword() {
  1000. X
  1001. X   short c, i;
  1002. X   char *p, *getpass();
  1003. X
  1004. X   p = getpass( "Password: ");
  1005. X   return( (strcmp( p, PASSWORD) == 0) ? 0 : E_ILLPASSWORD);
  1006. X}
  1007. X
  1008. Xchar *message[] = {
  1009. X   "illegal error number",
  1010. X   "cannot open screen file",
  1011. X   "more than one player position in screen file",
  1012. X   "illegal char in screen file",
  1013. X   "no player position in screenfile",
  1014. X   "too much rows in screen file",
  1015. X   "too much columns in screenfile",
  1016. X   "quit the game",
  1017. X   "cannot open the help file",
  1018. X   "cannot get your username",
  1019. X   "cannot open savefile",
  1020. X   "error writing to savefile",
  1021. X   "cannot stat savefile",
  1022. X   "error reading savefile",
  1023. X   "cannot restore, your savefile has been altered",
  1024. X   "game saved",
  1025. X   "too much users in score table",
  1026. X   "cannot open score file",
  1027. X   "error reading scorefile",
  1028. X   "error writing scorefile",
  1029. X   "illegal command line syntax",
  1030. X   "illegal password",
  1031. X   "level number too big in command line",
  1032. X   "only superuser is allowed to make a new score table",
  1033. X   "cannot find file to restore"
  1034. X};
  1035. X
  1036. Xerrmess( ret) 
  1037. Xshort ret;
  1038. X{
  1039. X   if( ret != E_ENDGAME) {
  1040. X      fprintf( stderr, "%s: ", prgname);
  1041. X      switch( ret) {
  1042. X         case E_FOPENSCREEN: case E_PLAYPOS1:   case E_ILLCHAR: 
  1043. X     case E_PLAYPOS2:    case E_TOMUCHROWS: case E_TOMUCHCOLS: 
  1044. X     case E_ENDGAME:     case E_FOPENHELP:  case E_NOUSER:      
  1045. X     case E_FOPENSAVE:   case E_WRITESAVE:  case E_STATSAVE:    
  1046. X     case E_READSAVE:    case E_ALTERSAVE:  case E_SAVED:       
  1047. X     case E_TOMUCHSE:    case E_FOPENSCORE: case E_READSCORE: 
  1048. X     case E_WRITESCORE:  case E_USAGE:    case E_ILLPASSWORD:
  1049. X     case E_LEVELTOOHIGH: case E_NOSUPER:    case E_NOSAVEFILE:
  1050. X                 fprintf( stderr, "%s\n", message[ret]);
  1051. X                             break;
  1052. X         default:            fprintf( stderr, "%s\n", message[0]);
  1053. X                             break;
  1054. X      }
  1055. X      if( ret == E_USAGE) usage();
  1056. X   }
  1057. X}
  1058. X
  1059. Xusage() {
  1060. X
  1061. X   fprintf( stderr, "Usage: %s [-{s|c|r|<nn>}]\n\n", prgname);
  1062. X   fprintf( stderr, "           -c:    create new score table (superuser only)\n");
  1063. X   fprintf( stderr, "           -r:    restore saved game\n");
  1064. X   fprintf( stderr, "           -s:    show score table\n");
  1065. X   fprintf( stderr, "           -<nn>: play this level (<nn> must be greater 0)\n");
  1066. X}
  1067. END_OF_FILE
  1068. if test 4668 -ne `wc -c <'sok.c'`; then
  1069.     echo shar: \"'sok.c'\" unpacked with wrong size!
  1070. fi
  1071. # end of 'sok.c'
  1072. fi
  1073. if test -f 'sokoban.h' -a "${1}" != "-c" ; then 
  1074.   echo shar: Will not clobber existing file \"'sokoban.h'\"
  1075. else
  1076. echo shar: Extracting \"'sokoban.h'\" \(2518 characters\)
  1077. sed "s/^X//" >'sokoban.h' <<'END_OF_FILE'
  1078. X/***********************************************************************
  1079. X   You may wish to alter the following directory paths
  1080. X***********************************************************************/
  1081. X/**/
  1082. X/* SCREENPATH: the name of the directioy where the screen file are held */
  1083. X/**/
  1084. X#define SCREENPATH     "/usr/games/lib/sokoban/screens"
  1085. X
  1086. X/**/
  1087. X/* HELPFILE: the full pathname of the helpfile */
  1088. X/**/
  1089. X#define HELPFILE    "/usr/games/lib/sokoban/sokoban.help"
  1090. X
  1091. X/**/
  1092. X/* SAVEPATH: the name of the path where save files are held */
  1093. X/*           Attention: Be sure that there are no other files with */
  1094. X/*                      the name <username>.sav                    */
  1095. X/**/
  1096. X#define SAVEPATH    "/usr/games/lib/sokoban"
  1097. X
  1098. X/**/
  1099. X/* LOCKPATH: temporary file which is created to ensure that no users */
  1100. X/*           work with the scorefile at the same time                */
  1101. X/**/
  1102. X#define LOCKFILE    "/tmp/sok.lock"
  1103. X
  1104. X/**/
  1105. X/* SCOREFILE: the full pathname of the score file */
  1106. X/**/
  1107. X#define SCOREFILE    "/usr/games/lib/sokoban/sok.score"
  1108. X
  1109. X/**/
  1110. X/* MAXUSERNAME: defines the maximum length of a system's user name */
  1111. X/**/
  1112. X#define MAXUSERNAME    10
  1113. X
  1114. X/**/
  1115. X/* MAXSCOREENTRIES: defines the maximum numner of entries in the scoretable */
  1116. X/**/
  1117. X#define MAXSCOREENTRIES    50
  1118. X
  1119. X/**/
  1120. X/* SUPERUSER: defines the name of the game superuser */
  1121. X/**/
  1122. X#define SUPERUSER "root"
  1123. X
  1124. X/**/
  1125. X/* PASSWORD: defines the password necessary for creating a new score file */
  1126. X/**/
  1127. X#define PASSWORD "nabokos"
  1128. X
  1129. X/*************************************************************************
  1130. X********************** DO NOT CHANGE BELOW THIS LINE *********************
  1131. X*************************************************************************/
  1132. X#define C_PLAYER    '@'
  1133. X#define C_PLAYERSTORE   '+'
  1134. X#define C_WALL        '#'
  1135. X#define C_GROUND    ' '
  1136. X#define C_STORE        '.'
  1137. X#define C_PACKET    '$'
  1138. X#define C_SAVE        '*'
  1139. X
  1140. X#define MAXROW        20
  1141. X#define MAXCOL        40
  1142. X
  1143. Xtypedef struct {
  1144. X   short x, y;
  1145. X} POS;
  1146. X
  1147. Xchar *malloc();
  1148. XFILE *fopen();
  1149. X
  1150. X#define storepos( p, a, b)    p.x = a; p.y = b;
  1151. X
  1152. X#define E_FOPENSCREEN    1
  1153. X#define E_PLAYPOS1    2
  1154. X#define E_ILLCHAR    3
  1155. X#define E_PLAYPOS2    4
  1156. X#define E_TOMUCHROWS    5
  1157. X#define E_TOMUCHCOLS    6
  1158. X#define E_ENDGAME    7
  1159. X#define E_FOPENHELP    8
  1160. X#define E_NOUSER    9
  1161. X#define E_FOPENSAVE    10
  1162. X#define E_WRITESAVE    11
  1163. X#define E_STATSAVE    12
  1164. X#define E_READSAVE    13
  1165. X#define E_ALTERSAVE    14
  1166. X#define E_SAVED        15
  1167. X#define E_TOMUCHSE    16
  1168. X#define E_FOPENSCORE    17
  1169. X#define E_READSCORE    18
  1170. X#define E_WRITESCORE    19
  1171. X#define E_USAGE        20
  1172. X#define E_ILLPASSWORD    21
  1173. X#define E_LEVELTOOHIGH    22
  1174. X#define E_NOSUPER    23
  1175. X#define E_NOSAVEFILE    24
  1176. END_OF_FILE
  1177. if test 2518 -ne `wc -c <'sokoban.h'`; then
  1178.     echo shar: \"'sokoban.h'\" unpacked with wrong size!
  1179. fi
  1180. # end of 'sokoban.h'
  1181. fi
  1182. if test -f 'sokoban.help' -a "${1}" != "-c" ; then 
  1183.   echo shar: Will not clobber existing file \"'sokoban.help'\"
  1184. else
  1185. echo shar: Extracting \"'sokoban.help'\" \(1236 characters\)
  1186. sed "s/^X//" >'sokoban.help' <<'END_OF_FILE'
  1187. X
  1188. X            S O K O B A N
  1189. X
  1190. X The problem is to push packets to saving positions by moving around
  1191. X and pushing only one packet at a time if possible.
  1192. X
  1193. X
  1194. X Available Commands are:
  1195. X
  1196. X h:  move/push left       H:  run/push left    ^H:  run left to object
  1197. X l:  move/push right       L:  run/push right    ^L:  run right to object
  1198. X j:  move/push down       J:  run/push down    ^J:  run down to object
  1199. X k:  move/push up       K:  run/push up    ^K:  run up to object
  1200. X
  1201. X u:  undo last move/push  U:  undo all         
  1202. X c:  temporary save      ^U:  reset to temporary save
  1203. X ^R: Refresh screen
  1204. X
  1205. X q:  quit           s:  save the game     ?:  this help screen
  1206. X+= (DO NOT CHANGE OR DELETE THIS LINE)
  1207. X
  1208. X Characters on screen are:
  1209. X
  1210. X    @@    player                ++    player on saving position
  1211. X    ..    saving position for packet    $$       packets
  1212. X    **    saved packet             ##    wall
  1213. X
  1214. X
  1215. X As you could see you can make a temporary save. This is useful if you think
  1216. X that all the moves/pushes you have made are correct, but you don't know how
  1217. X to go on. In this case you can temporary save (using the c command). If you
  1218. X then get stucked you need not undo all (using U), you can reset to you
  1219. X temporary save.
  1220. X
  1221. X If you have restored a saved game, a temporary save is automatically made
  1222. X at the start.
  1223. X== (DO NOT CHANGE THIS LINE)
  1224. END_OF_FILE
  1225. if test 1236 -ne `wc -c <'sokoban.help'`; then
  1226.     echo shar: \"'sokoban.help'\" unpacked with wrong size!
  1227. fi
  1228. # end of 'sokoban.help'
  1229. fi
  1230. if test -f 'screen.1' -a "${1}" != "-c" ; then 
  1231.   echo shar: Will not clobber existing file \"'screen.1'\"
  1232. else
  1233. echo shar: Extracting \"'screen.1'\" \(164 characters\)
  1234. sed "s/^X//" >'screen.1' <<'END_OF_FILE'
  1235. X    #####
  1236. X    #   #
  1237. X    #$  #
  1238. X  ###  $##
  1239. X  #  $ $ #
  1240. X### # ## #   ######
  1241. X#   # ## #####  ..#
  1242. X# $  $          ..#
  1243. X##### ### #@##  ..#
  1244. X    #     #########
  1245. X    #######
  1246. END_OF_FILE
  1247. if test 164 -ne `wc -c <'screen.1'`; then
  1248.     echo shar: \"'screen.1'\" unpacked with wrong size!
  1249. fi
  1250. # end of 'screen.1'
  1251. fi
  1252. if test -f 'screen.10' -a "${1}" != "-c" ; then 
  1253.   echo shar: Will not clobber existing file \"'screen.10'\"
  1254. else
  1255. echo shar: Extracting \"'screen.10'\" \(320 characters\)
  1256. sed "s/^X//" >'screen.10' <<'END_OF_FILE'
  1257. X ###  #############
  1258. X##@####       #   #
  1259. X# $$   $$  $ $ ...#
  1260. X#  $$$#    $  #...#
  1261. X# $   # $$ $$ #...#
  1262. X###   #  $    #...#
  1263. X#     # $ $ $ #...#
  1264. X#    ###### ###...#
  1265. X## #  #  $ $  #...#
  1266. X#  ## # $$ $ $##..#
  1267. X# ..# #  $      #.#
  1268. X# ..# # $$$ $$$ #.#
  1269. X##### #       # #.#
  1270. X    # ######### #.#
  1271. X    #           #.#
  1272. X    ###############
  1273. END_OF_FILE
  1274. if test 320 -ne `wc -c <'screen.10'`; then
  1275.     echo shar: \"'screen.10'\" unpacked with wrong size!
  1276. fi
  1277. # end of 'screen.10'
  1278. fi
  1279. if test -f 'screen.11' -a "${1}" != "-c" ; then 
  1280.   echo shar: Will not clobber existing file \"'screen.11'\"
  1281. else
  1282. echo shar: Extracting \"'screen.11'\" \(223 characters\)
  1283. sed "s/^X//" >'screen.11' <<'END_OF_FILE'
  1284. X          ####
  1285. X     #### #  #
  1286. X   ### @###$ #
  1287. X  ##      $  #
  1288. X ##  $ $$## ##
  1289. X #  #$##     #
  1290. X # # $ $$ # ###
  1291. X #   $ #  # $ #####
  1292. X####    #  $$ #   #
  1293. X#### ## $         #
  1294. X#.    ###  ########
  1295. X#.. ..# ####
  1296. X#...#.#
  1297. X#.....#
  1298. X#######
  1299. END_OF_FILE
  1300. if test 223 -ne `wc -c <'screen.11'`; then
  1301.     echo shar: \"'screen.11'\" unpacked with wrong size!
  1302. fi
  1303. # end of 'screen.11'
  1304. fi
  1305. if test -f 'screen.12' -a "${1}" != "-c" ; then 
  1306.   echo shar: Will not clobber existing file \"'screen.12'\"
  1307. else
  1308. echo shar: Extracting \"'screen.12'\" \(226 characters\)
  1309. sed "s/^X//" >'screen.12' <<'END_OF_FILE'
  1310. X################
  1311. X#              #
  1312. X# # ######     #
  1313. X# #  $ $ $ $#  #
  1314. X# #   $@$   ## ##
  1315. X# #  $ $ $###...#
  1316. X# #   $ $  ##...#
  1317. X# ###$$$ $ ##...#
  1318. X#     # ## ##...#
  1319. X#####   ## ##...#
  1320. X    #####     ###
  1321. X        #     #
  1322. X        #######
  1323. END_OF_FILE
  1324. if test 226 -ne `wc -c <'screen.12'`; then
  1325.     echo shar: \"'screen.12'\" unpacked with wrong size!
  1326. fi
  1327. # end of 'screen.12'
  1328. fi
  1329. if test -f 'screen.13' -a "${1}" != "-c" ; then 
  1330.   echo shar: Will not clobber existing file \"'screen.13'\"
  1331. else
  1332. echo shar: Extracting \"'screen.13'\" \(236 characters\)
  1333. sed "s/^X//" >'screen.13' <<'END_OF_FILE'
  1334. X   #########
  1335. X  ##   ##  #####
  1336. X###     #  #    ###
  1337. X#  $ #$ #  #  ... #
  1338. X# # $#@$## # #.#. #
  1339. X#  # #$  #    . . #
  1340. X# $    $ # # #.#. #
  1341. X#   ##  ##$ $ . . #
  1342. X# $ #   #  #$#.#. #
  1343. X## $  $   $  $... #
  1344. X #$ ######    ##  #
  1345. X #  #    ##########
  1346. X ####
  1347. END_OF_FILE
  1348. if test 236 -ne `wc -c <'screen.13'`; then
  1349.     echo shar: \"'screen.13'\" unpacked with wrong size!
  1350. fi
  1351. # end of 'screen.13'
  1352. fi
  1353. if test -f 'screen.14' -a "${1}" != "-c" ; then 
  1354.   echo shar: Will not clobber existing file \"'screen.14'\"
  1355. else
  1356. echo shar: Extracting \"'screen.14'\" \(284 characters\)
  1357. sed "s/^X//" >'screen.14' <<'END_OF_FILE'
  1358. X       #######
  1359. X #######     #
  1360. X #     # $@$ #
  1361. X #$$ #   #########
  1362. X # ###......##   #
  1363. X #   $......## # #
  1364. X # ###......     #
  1365. X##   #### ### #$##
  1366. X#  #$   #  $  # #
  1367. X#  $ $$$  # $## #
  1368. X#   $ $ ###$$ # #
  1369. X#####     $   # #
  1370. X    ### ###   # #
  1371. X      #     #   #
  1372. X      ########  #
  1373. X             ####
  1374. END_OF_FILE
  1375. if test 284 -ne `wc -c <'screen.14'`; then
  1376.     echo shar: \"'screen.14'\" unpacked with wrong size!
  1377. fi
  1378. # end of 'screen.14'
  1379. fi
  1380. if test -f 'screen.15' -a "${1}" != "-c" ; then 
  1381.   echo shar: Will not clobber existing file \"'screen.15'\"
  1382. else
  1383. echo shar: Extracting \"'screen.15'\" \(229 characters\)
  1384. sed "s/^X//" >'screen.15' <<'END_OF_FILE'
  1385. X    #######
  1386. X   #   #  #
  1387. X   #  $   #
  1388. X ### #$   ####
  1389. X #  $  ##$   #
  1390. X #  # @ $ # $#
  1391. X #  #      $ ####
  1392. X ## ####$##     #
  1393. X # $#.....# #   #
  1394. X #  $..**. $# ###
  1395. X##  #.....#   #
  1396. X#   ### #######
  1397. X# $$  #  #
  1398. X#  #     #
  1399. X######   #
  1400. X     #####
  1401. END_OF_FILE
  1402. if test 229 -ne `wc -c <'screen.15'`; then
  1403.     echo shar: \"'screen.15'\" unpacked with wrong size!
  1404. fi
  1405. # end of 'screen.15'
  1406. fi
  1407. if test -f 'screen.16' -a "${1}" != "-c" ; then 
  1408.   echo shar: Will not clobber existing file \"'screen.16'\"
  1409. else
  1410. echo shar: Extracting \"'screen.16'\" \(185 characters\)
  1411. sed "s/^X//" >'screen.16' <<'END_OF_FILE'
  1412. X#####
  1413. X#   ##
  1414. X#    #  ####
  1415. X# $  ####  #
  1416. X#  $$ $   $#
  1417. X###@ #$    ##
  1418. X #  ##  $ $ ##
  1419. X # $  ## ## .#
  1420. X #  #$##$  #.#
  1421. X ###   $..##.#
  1422. X  #    #.*...#
  1423. X  # $$ #.....#
  1424. X  #  #########
  1425. X  #  #
  1426. X  ####
  1427. END_OF_FILE
  1428. if test 185 -ne `wc -c <'screen.16'`; then
  1429.     echo shar: \"'screen.16'\" unpacked with wrong size!
  1430. fi
  1431. # end of 'screen.16'
  1432. fi
  1433. if test -f 'screen.17' -a "${1}" != "-c" ; then 
  1434.   echo shar: Will not clobber existing file \"'screen.17'\"
  1435. else
  1436. echo shar: Extracting \"'screen.17'\" \(213 characters\)
  1437. sed "s/^X//" >'screen.17' <<'END_OF_FILE'
  1438. X   ##########
  1439. X   #..  #   #
  1440. X   #..      #
  1441. X   #..  #  ####
  1442. X  #######  #  ##
  1443. X  #            #
  1444. X  #  #  ##  #  #
  1445. X#### ##  #### ##
  1446. X#  $  ##### #  #
  1447. X# # $  $  # $  #
  1448. X# @$  $   #   ##
  1449. X#### ## #######
  1450. X   #    #
  1451. X   ######
  1452. END_OF_FILE
  1453. if test 213 -ne `wc -c <'screen.17'`; then
  1454.     echo shar: \"'screen.17'\" unpacked with wrong size!
  1455. fi
  1456. # end of 'screen.17'
  1457. fi
  1458. if test -f 'screen.18' -a "${1}" != "-c" ; then 
  1459.   echo shar: Will not clobber existing file \"'screen.18'\"
  1460. else
  1461. echo shar: Extracting \"'screen.18'\" \(249 characters\)
  1462. sed "s/^X//" >'screen.18' <<'END_OF_FILE'
  1463. X     ###########
  1464. X     #  .  #   #
  1465. X     # #.    @ #
  1466. X ##### ##..# ####
  1467. X##  # ..###     ###
  1468. X# $ #...   $ #  $ #
  1469. X#    .. ##  ## ## #
  1470. X####$##$# $ #   # #
  1471. X  ## #    #$ $$ # #
  1472. X  #  $ # #  # $## #
  1473. X  #               #
  1474. X  #  ###########  #
  1475. X  ####         ####
  1476. END_OF_FILE
  1477. if test 249 -ne `wc -c <'screen.18'`; then
  1478.     echo shar: \"'screen.18'\" unpacked with wrong size!
  1479. fi
  1480. # end of 'screen.18'
  1481. fi
  1482. if test -f 'screen.19' -a "${1}" != "-c" ; then 
  1483.   echo shar: Will not clobber existing file \"'screen.19'\"
  1484. else
  1485. echo shar: Extracting \"'screen.19'\" \(258 characters\)
  1486. sed "s/^X//" >'screen.19' <<'END_OF_FILE'
  1487. X  ######
  1488. X  #   @####
  1489. X##### $   #
  1490. X#   ##    ####
  1491. X# $ #  ##    #
  1492. X# $ #  ##### #
  1493. X## $  $    # #
  1494. X## $ $ ### # #
  1495. X## #  $  # # #
  1496. X## # #$#   # #
  1497. X## ###   # # ######
  1498. X#  $  #### # #....#
  1499. X#    $    $   ..#.#
  1500. X####$  $# $   ....#
  1501. X#       #  ## ....#
  1502. X###################
  1503. END_OF_FILE
  1504. if test 258 -ne `wc -c <'screen.19'`; then
  1505.     echo shar: \"'screen.19'\" unpacked with wrong size!
  1506. fi
  1507. # end of 'screen.19'
  1508. fi
  1509. if test -f 'screen.2' -a "${1}" != "-c" ; then 
  1510.   echo shar: Will not clobber existing file \"'screen.2'\"
  1511. else
  1512. echo shar: Extracting \"'screen.2'\" \(148 characters\)
  1513. sed "s/^X//" >'screen.2' <<'END_OF_FILE'
  1514. X############
  1515. X#..  #     ###
  1516. X#..  # $  $  #
  1517. X#..  #$####  #
  1518. X#..    @ ##  #
  1519. X#..  # #  $ ##
  1520. X###### ##$ $ #
  1521. X  # $  $ $ $ #
  1522. X  #    #     #
  1523. X  ############
  1524. END_OF_FILE
  1525. if test 148 -ne `wc -c <'screen.2'`; then
  1526.     echo shar: \"'screen.2'\" unpacked with wrong size!
  1527. fi
  1528. # end of 'screen.2'
  1529. fi
  1530. if test -f 'screen.20' -a "${1}" != "-c" ; then 
  1531.   echo shar: Will not clobber existing file \"'screen.20'\"
  1532. else
  1533. echo shar: Extracting \"'screen.20'\" \(303 characters\)
  1534. sed "s/^X//" >'screen.20' <<'END_OF_FILE'
  1535. X    ##########
  1536. X#####        ####
  1537. X#     #   $  #@ #
  1538. X# #######$####  ###
  1539. X# #    ## #  #$ ..#
  1540. X# # $     #  #  #.#
  1541. X# # $  #     #$ ..#
  1542. X# #  ### ##     #.#
  1543. X# ###  #  #  #$ ..#
  1544. X# #    #  ####  #.#
  1545. X# #$   $  $  #$ ..#
  1546. X#    $ # $ $ #  #.#
  1547. X#### $###    #$ ..#
  1548. X   #    $$ ###....#
  1549. X   #      ## ######
  1550. X   ########
  1551. END_OF_FILE
  1552. if test 303 -ne `wc -c <'screen.20'`; then
  1553.     echo shar: \"'screen.20'\" unpacked with wrong size!
  1554. fi
  1555. # end of 'screen.20'
  1556. fi
  1557. if test -f 'screen.21' -a "${1}" != "-c" ; then 
  1558.   echo shar: Will not clobber existing file \"'screen.21'\"
  1559. else
  1560. echo shar: Extracting \"'screen.21'\" \(209 characters\)
  1561. sed "s/^X//" >'screen.21' <<'END_OF_FILE'
  1562. X#########
  1563. X#       #
  1564. X#       ####
  1565. X## #### #  #
  1566. X## #@##    #
  1567. X# $$$ $  $$#
  1568. X#  # ## $  #
  1569. X#  # ##  $ ####
  1570. X####  $$$ $#  #
  1571. X #   ##   ....#
  1572. X # #   # #.. .#
  1573. X #   # # ##...#
  1574. X ##### $  #...#
  1575. X     ##   #####
  1576. X      #####
  1577. END_OF_FILE
  1578. if test 209 -ne `wc -c <'screen.21'`; then
  1579.     echo shar: \"'screen.21'\" unpacked with wrong size!
  1580. fi
  1581. # end of 'screen.21'
  1582. fi
  1583. if test -f 'screen.22' -a "${1}" != "-c" ; then 
  1584.   echo shar: Will not clobber existing file \"'screen.22'\"
  1585. else
  1586. echo shar: Extracting \"'screen.22'\" \(311 characters\)
  1587. sed "s/^X//" >'screen.22' <<'END_OF_FILE'
  1588. X#####      ####
  1589. X#    #######  #####
  1590. X#   $#  #  $  #   #
  1591. X#  $  $  $ # $ $  #
  1592. X##$ $   # @# $    #
  1593. X#  $ ########### ##
  1594. X# #   #.......# $#
  1595. X# ##  # ......#  #
  1596. X# #   $........$ #
  1597. X# # $ #.... ..#  #
  1598. X#  $ $####$#### $#
  1599. X# $   ### $   $  ##
  1600. X# $     $ $  $    #
  1601. X## ###### $ ##### #
  1602. X#         #       #
  1603. X###################
  1604. END_OF_FILE
  1605. if test 311 -ne `wc -c <'screen.22'`; then
  1606.     echo shar: \"'screen.22'\" unpacked with wrong size!
  1607. fi
  1608. # end of 'screen.22'
  1609. fi
  1610. if test -f 'screen.23' -a "${1}" != "-c" ; then 
  1611.   echo shar: Will not clobber existing file \"'screen.23'\"
  1612. else
  1613. echo shar: Extracting \"'screen.23'\" \(254 characters\)
  1614. sed "s/^X//" >'screen.23' <<'END_OF_FILE'
  1615. X    #######
  1616. X    #  #  ####
  1617. X##### $#$ #  ##
  1618. X#.. #  #  #   #
  1619. X#.. # $#$ #  $####
  1620. X#.  #     #$  #  #
  1621. X#..   $#  # $    #
  1622. X#..@#  #$ #$  #  #
  1623. X#.. # $#     $#  #
  1624. X#.. #  #$$#$  #  ##
  1625. X#.. # $#  #  $#$  #
  1626. X#.. #  #  #   #   #
  1627. X##. ####  #####   #
  1628. X ####  ####   #####
  1629. END_OF_FILE
  1630. if test 254 -ne `wc -c <'screen.23'`; then
  1631.     echo shar: \"'screen.23'\" unpacked with wrong size!
  1632. fi
  1633. # end of 'screen.23'
  1634. fi
  1635. if test -f 'screen.24' -a "${1}" != "-c" ; then 
  1636.   echo shar: Will not clobber existing file \"'screen.24'\"
  1637. else
  1638. echo shar: Extracting \"'screen.24'\" \(305 characters\)
  1639. sed "s/^X//" >'screen.24' <<'END_OF_FILE'
  1640. X###############
  1641. X#..........  .####
  1642. X#..........$$.#  #
  1643. X###########$ #   ##
  1644. X#      $  $     $ #
  1645. X## ####   #  $ #  #
  1646. X#      #   ##  # ##
  1647. X#  $#  # ##  ### ##
  1648. X# $ #$###    ### ##
  1649. X###  $ #  #  ### ##
  1650. X###    $ ## #  # ##
  1651. X # $  #  $  $ $   #
  1652. X #  $  $#$$$  #   #
  1653. X #  #  $      #####
  1654. X # @##  #  #  #
  1655. X #############
  1656. END_OF_FILE
  1657. if test 305 -ne `wc -c <'screen.24'`; then
  1658.     echo shar: \"'screen.24'\" unpacked with wrong size!
  1659. fi
  1660. # end of 'screen.24'
  1661. fi
  1662. if test -f 'screen.25' -a "${1}" != "-c" ; then 
  1663.   echo shar: Will not clobber existing file \"'screen.25'\"
  1664. else
  1665. echo shar: Extracting \"'screen.25'\" \(295 characters\)
  1666. sed "s/^X//" >'screen.25' <<'END_OF_FILE'
  1667. X####
  1668. X#  ##############
  1669. X#  #   ..#......#
  1670. X#  # # ##### ...#
  1671. X##$#    ........#
  1672. X#   ##$######  ####
  1673. X# $ #     ######@ #
  1674. X##$ # $   ######  #
  1675. X#  $ #$$$##       #
  1676. X#      #    #$#$###
  1677. X# #### #$$$$$    #
  1678. X# #    $     #   #
  1679. X# #   ##        ###
  1680. X# ######$###### $ #
  1681. X#        #    #   #
  1682. X##########    #####
  1683. END_OF_FILE
  1684. if test 295 -ne `wc -c <'screen.25'`; then
  1685.     echo shar: \"'screen.25'\" unpacked with wrong size!
  1686. fi
  1687. # end of 'screen.25'
  1688. fi
  1689. if test -f 'screen.26' -a "${1}" != "-c" ; then 
  1690.   echo shar: Will not clobber existing file \"'screen.26'\"
  1691. else
  1692. echo shar: Extracting \"'screen.26'\" \(177 characters\)
  1693. sed "s/^X//" >'screen.26' <<'END_OF_FILE'
  1694. X #######
  1695. X #  #  #####
  1696. X##  #  #...###
  1697. X#  $#  #...  #
  1698. X# $ #$$ ...  #
  1699. X#  $#  #... .#
  1700. X#   # $########
  1701. X##$       $ $ #
  1702. X##  #  $$ #   #
  1703. X ######  ##$$@#
  1704. X      #      ##
  1705. X      ########
  1706. END_OF_FILE
  1707. if test 177 -ne `wc -c <'screen.26'`; then
  1708.     echo shar: \"'screen.26'\" unpacked with wrong size!
  1709. fi
  1710. # end of 'screen.26'
  1711. fi
  1712. if test -f 'screen.27' -a "${1}" != "-c" ; then 
  1713.   echo shar: Will not clobber existing file \"'screen.27'\"
  1714. else
  1715. echo shar: Extracting \"'screen.27'\" \(248 characters\)
  1716. sed "s/^X//" >'screen.27' <<'END_OF_FILE'
  1717. X #################
  1718. X #...   #    #   ##
  1719. X##.....  $## # #$ #
  1720. X#......#  $  #    #
  1721. X#......#  #  # #  #
  1722. X######### $  $ $  #
  1723. X  #     #$##$ ##$##
  1724. X ##   $    # $    #
  1725. X #  ## ### #  ##$ #
  1726. X # $ $$     $  $  #
  1727. X # $    $##$ ######
  1728. X #######  @ ##
  1729. X       ######
  1730. END_OF_FILE
  1731. if test 248 -ne `wc -c <'screen.27'`; then
  1732.     echo shar: \"'screen.27'\" unpacked with wrong size!
  1733. fi
  1734. # end of 'screen.27'
  1735. fi
  1736. if test -f 'screen.28' -a "${1}" != "-c" ; then 
  1737.   echo shar: Will not clobber existing file \"'screen.28'\"
  1738. else
  1739. echo shar: Extracting \"'screen.28'\" \(258 characters\)
  1740. sed "s/^X//" >'screen.28' <<'END_OF_FILE'
  1741. X         #####
  1742. X     #####   #
  1743. X    ## $  $  ####
  1744. X##### $  $ $ ##.#
  1745. X#       $$  ##..#
  1746. X#  ###### ###.. #
  1747. X## #  #    #... #
  1748. X# $   #    #... #
  1749. X#@ #$ ## ####...#
  1750. X####  $ $$  ##..#
  1751. X   ##  $ $  $...#
  1752. X    # $$  $ #  .#
  1753. X    #   $ $  ####
  1754. X    ######   #
  1755. X         #####
  1756. END_OF_FILE
  1757. if test 258 -ne `wc -c <'screen.28'`; then
  1758.     echo shar: \"'screen.28'\" unpacked with wrong size!
  1759. fi
  1760. # end of 'screen.28'
  1761. fi
  1762. if test -f 'screen.29' -a "${1}" != "-c" ; then 
  1763.   echo shar: Will not clobber existing file \"'screen.29'\"
  1764. else
  1765. echo shar: Extracting \"'screen.29'\" \(228 characters\)
  1766. sed "s/^X//" >'screen.29' <<'END_OF_FILE'
  1767. X#####
  1768. X#   ##
  1769. X# $  #########
  1770. X## # #       ######
  1771. X## #   $#$#@  #   #
  1772. X#  #      $ #   $ #
  1773. X#  ### ######### ##
  1774. X#  ## ..*..... # ##
  1775. X## ## *.*..*.* # ##
  1776. X# $########## ##$ #
  1777. X#  $   $  $    $  #
  1778. X#  #   #   #   #  #
  1779. X###################
  1780. END_OF_FILE
  1781. if test 228 -ne `wc -c <'screen.29'`; then
  1782.     echo shar: \"'screen.29'\" unpacked with wrong size!
  1783. fi
  1784. # end of 'screen.29'
  1785. fi
  1786. if test -f 'screen.3' -a "${1}" != "-c" ; then 
  1787.   echo shar: Will not clobber existing file \"'screen.3'\"
  1788. else
  1789. echo shar: Extracting \"'screen.3'\" \(164 characters\)
  1790. sed "s/^X//" >'screen.3' <<'END_OF_FILE'
  1791. X        ########
  1792. X        #     @#
  1793. X        # $#$ ##
  1794. X        # $  $#
  1795. X        ##$ $ #
  1796. X######### $ # ###
  1797. X#....  ## $  $  #
  1798. X##...    $  $   #
  1799. X#....  ##########
  1800. X########
  1801. END_OF_FILE
  1802. if test 164 -ne `wc -c <'screen.3'`; then
  1803.     echo shar: \"'screen.3'\" unpacked with wrong size!
  1804. fi
  1805. # end of 'screen.3'
  1806. fi
  1807. if test -f 'screen.30' -a "${1}" != "-c" ; then 
  1808.   echo shar: Will not clobber existing file \"'screen.30'\"
  1809. else
  1810. echo shar: Extracting \"'screen.30'\" \(270 characters\)
  1811. sed "s/^X//" >'screen.30' <<'END_OF_FILE'
  1812. X       ###########
  1813. X       #   #     #
  1814. X#####  #     $ $ #
  1815. X#   ##### $## # ##
  1816. X# $ ##   # ## $  #
  1817. X# $  @$$ # ##$$$ #
  1818. X## ###   # ##    #
  1819. X## #   ### #####$#
  1820. X## #     $  #....#
  1821. X#  ### ## $ #....##
  1822. X# $   $ #   #..$. #
  1823. X#  ## $ #  ##.... #
  1824. X#####   ######...##
  1825. X    #####    #####
  1826. END_OF_FILE
  1827. if test 270 -ne `wc -c <'screen.30'`; then
  1828.     echo shar: \"'screen.30'\" unpacked with wrong size!
  1829. fi
  1830. # end of 'screen.30'
  1831. fi
  1832. if test -f 'screen.31' -a "${1}" != "-c" ; then 
  1833.   echo shar: Will not clobber existing file \"'screen.31'\"
  1834. else
  1835. echo shar: Extracting \"'screen.31'\" \(236 characters\)
  1836. sed "s/^X//" >'screen.31' <<'END_OF_FILE'
  1837. X  ####
  1838. X  #  #########
  1839. X ##  ##  #   #
  1840. X #  $# $@$   ####
  1841. X #$  $  # $ $#  ##
  1842. X##  $## #$ $     #
  1843. X#  #  # #   $$$  #
  1844. X# $    $  $## ####
  1845. X# $ $ #$#  #  #
  1846. X##  ###  ###$ #
  1847. X #  #....     #
  1848. X ####......####
  1849. X   #....####
  1850. X   #...##
  1851. X   #...#
  1852. X   #####
  1853. END_OF_FILE
  1854. if test 236 -ne `wc -c <'screen.31'`; then
  1855.     echo shar: \"'screen.31'\" unpacked with wrong size!
  1856. fi
  1857. # end of 'screen.31'
  1858. fi
  1859. if test -f 'screen.32' -a "${1}" != "-c" ; then 
  1860.   echo shar: Will not clobber existing file \"'screen.32'\"
  1861. else
  1862. echo shar: Extracting \"'screen.32'\" \(189 characters\)
  1863. sed "s/^X//" >'screen.32' <<'END_OF_FILE'
  1864. X      ####
  1865. X  #####  #
  1866. X ##     $#
  1867. X## $  ## ###
  1868. X#@$ $ # $  #
  1869. X#### ##   $#
  1870. X #....#$ $ #
  1871. X #....#   $#
  1872. X #....  $$ ##
  1873. X #... # $   #
  1874. X ######$ $  #
  1875. X      #   ###
  1876. X      #$ ###
  1877. X      #  #
  1878. X      ####
  1879. END_OF_FILE
  1880. if test 189 -ne `wc -c <'screen.32'`; then
  1881.     echo shar: \"'screen.32'\" unpacked with wrong size!
  1882. fi
  1883. # end of 'screen.32'
  1884. fi
  1885. if test -f 'screen.33' -a "${1}" != "-c" ; then 
  1886.   echo shar: Will not clobber existing file \"'screen.33'\"
  1887. else
  1888. echo shar: Extracting \"'screen.33'\" \(195 characters\)
  1889. sed "s/^X//" >'screen.33' <<'END_OF_FILE'
  1890. X############
  1891. X##     ##  #
  1892. X##   $   $ #
  1893. X#### ## $$ #
  1894. X#   $ #    #
  1895. X# $$$ # ####
  1896. X#   # # $ ##
  1897. X#  #  #  $ #
  1898. X# $# $#    #
  1899. X#   ..# ####
  1900. X####.. $ #@#
  1901. X#.....# $# #
  1902. X##....#  $ #
  1903. X###..##    #
  1904. X############
  1905. END_OF_FILE
  1906. if test 195 -ne `wc -c <'screen.33'`; then
  1907.     echo shar: \"'screen.33'\" unpacked with wrong size!
  1908. fi
  1909. # end of 'screen.33'
  1910. fi
  1911. if test -f 'screen.34' -a "${1}" != "-c" ; then 
  1912.   echo shar: Will not clobber existing file \"'screen.34'\"
  1913. else
  1914. echo shar: Extracting \"'screen.34'\" \(203 characters\)
  1915. sed "s/^X//" >'screen.34' <<'END_OF_FILE'
  1916. X #########
  1917. X #....   ##
  1918. X #.#.#  $ ##
  1919. X##....# # @##
  1920. X# ....#  #  ##
  1921. X#     #$ ##$ #
  1922. X## ###  $    #
  1923. X #$  $ $ $#  #
  1924. X # #  $ $ ## #
  1925. X #  ###  ##  #
  1926. X #    ## ## ##
  1927. X #  $ #  $  #
  1928. X ###$ $   ###
  1929. X   #  #####
  1930. X   ####
  1931. END_OF_FILE
  1932. if test 203 -ne `wc -c <'screen.34'`; then
  1933.     echo shar: \"'screen.34'\" unpacked with wrong size!
  1934. fi
  1935. # end of 'screen.34'
  1936. fi
  1937. if test -f 'screen.35' -a "${1}" != "-c" ; then 
  1938.   echo shar: Will not clobber existing file \"'screen.35'\"
  1939. else
  1940. echo shar: Extracting \"'screen.35'\" \(298 characters\)
  1941. sed "s/^X//" >'screen.35' <<'END_OF_FILE'
  1942. X############ ######
  1943. X#   #    # ###....#
  1944. X#   $$#   @  .....#
  1945. X#   # ###   # ....#
  1946. X## ## ###  #  ....#
  1947. X # $ $     # # ####
  1948. X #  $ $##  #      #
  1949. X#### #  #### # ## #
  1950. X#  # #$   ## #    #
  1951. X# $  $  # ## #   ##
  1952. X# # $ $    # #   #
  1953. X#  $ ## ## # #####
  1954. X# $$     $$  #
  1955. X## ## ### $  #
  1956. X #    # #    #
  1957. X ###### ######
  1958. END_OF_FILE
  1959. if test 298 -ne `wc -c <'screen.35'`; then
  1960.     echo shar: \"'screen.35'\" unpacked with wrong size!
  1961. fi
  1962. # end of 'screen.35'
  1963. fi
  1964. if test -f 'screen.36' -a "${1}" != "-c" ; then 
  1965.   echo shar: Will not clobber existing file \"'screen.36'\"
  1966. else
  1967. echo shar: Extracting \"'screen.36'\" \(289 characters\)
  1968. sed "s/^X//" >'screen.36' <<'END_OF_FILE'
  1969. X            #####
  1970. X#####  ######   #
  1971. X#   ####  $ $ $ #
  1972. X# $   ## ## ##  ##
  1973. X#   $ $     $  $ #
  1974. X### $  ## ##     ##
  1975. X  # ##### #####$$ #
  1976. X ##$##### @##     #
  1977. X # $  ###$### $  ##
  1978. X # $  #   ###  ###
  1979. X # $$ $ #   $$ #
  1980. X #     #   ##  #
  1981. X #######.. .###
  1982. X    #.........#
  1983. X    #.........#
  1984. X    ###########
  1985. END_OF_FILE
  1986. if test 289 -ne `wc -c <'screen.36'`; then
  1987.     echo shar: \"'screen.36'\" unpacked with wrong size!
  1988. fi
  1989. # end of 'screen.36'
  1990. fi
  1991. if test -f 'screen.37' -a "${1}" != "-c" ; then 
  1992.   echo shar: Will not clobber existing file \"'screen.37'\"
  1993. else
  1994. echo shar: Extracting \"'screen.37'\" \(272 characters\)
  1995. sed "s/^X//" >'screen.37' <<'END_OF_FILE'
  1996. X###########
  1997. X#......   #########
  1998. X#......   #  ##   #
  1999. X#..### $    $     #
  2000. X#... $ $ #   ##   #
  2001. X#...#$#####    #  #
  2002. X###    #   #$  #$ #
  2003. X  #  $$ $ $  $##  #
  2004. X  #  $   #$#$ ##$ #
  2005. X  ### ## #    ##  #
  2006. X   #  $ $ ## ######
  2007. X   #    $  $  #
  2008. X   ##   # #   #
  2009. X    #####@#####
  2010. X        ###
  2011. END_OF_FILE
  2012. if test 272 -ne `wc -c <'screen.37'`; then
  2013.     echo shar: \"'screen.37'\" unpacked with wrong size!
  2014. fi
  2015. # end of 'screen.37'
  2016. fi
  2017. if test -f 'screen.38' -a "${1}" != "-c" ; then 
  2018.   echo shar: Will not clobber existing file \"'screen.38'\"
  2019. else
  2020. echo shar: Extracting \"'screen.38'\" \(120 characters\)
  2021. sed "s/^X//" >'screen.38' <<'END_OF_FILE'
  2022. X      ####
  2023. X####### @#
  2024. X#     $  #
  2025. X#   $## $#
  2026. X##$#...# #
  2027. X # $...  #
  2028. X # #. .# ##
  2029. X #   # #$ #
  2030. X #$  $    #
  2031. X #  #######
  2032. X ####
  2033. END_OF_FILE
  2034. if test 120 -ne `wc -c <'screen.38'`; then
  2035.     echo shar: \"'screen.38'\" unpacked with wrong size!
  2036. fi
  2037. # end of 'screen.38'
  2038. fi
  2039. if test -f 'screen.39' -a "${1}" != "-c" ; then 
  2040.   echo shar: Will not clobber existing file \"'screen.39'\"
  2041. else
  2042. echo shar: Extracting \"'screen.39'\" \(291 characters\)
  2043. sed "s/^X//" >'screen.39' <<'END_OF_FILE'
  2044. X             ######
  2045. X #############....#
  2046. X##   ##     ##....#
  2047. X#  $$##  $ @##....#
  2048. X#      $$ $#  ....#
  2049. X#  $ ## $$ # # ...#
  2050. X#  $ ## $  #  ....#
  2051. X## ##### ### ##.###
  2052. X##   $  $ ##   .  #
  2053. X# $###  # ##### ###
  2054. X#   $   #       #
  2055. X#  $ #$ $ $###  #
  2056. X# $$$# $   # ####
  2057. X#    #  $$ #
  2058. X######   ###
  2059. X     #####
  2060. END_OF_FILE
  2061. if test 291 -ne `wc -c <'screen.39'`; then
  2062.     echo shar: \"'screen.39'\" unpacked with wrong size!
  2063. fi
  2064. # end of 'screen.39'
  2065. fi
  2066. if test -f 'screen.4' -a "${1}" != "-c" ; then 
  2067.   echo shar: Will not clobber existing file \"'screen.4'\"
  2068. else
  2069. echo shar: Extracting \"'screen.4'\" \(230 characters\)
  2070. sed "s/^X//" >'screen.4' <<'END_OF_FILE'
  2071. X           ########
  2072. X           #  ....#
  2073. X############  ....#
  2074. X#    #  $ $   ....#
  2075. X# $$$#$  $ #  ....#
  2076. X#  $     $ #  ....#
  2077. X# $$ #$ $ $########
  2078. X#  $ #     #
  2079. X## #########
  2080. X#    #    ##
  2081. X#     $   ##
  2082. X#  $$#$$  @#
  2083. X#    #    ##
  2084. X###########
  2085. END_OF_FILE
  2086. if test 230 -ne `wc -c <'screen.4'`; then
  2087.     echo shar: \"'screen.4'\" unpacked with wrong size!
  2088. fi
  2089. # end of 'screen.4'
  2090. fi
  2091. if test -f 'screen.40' -a "${1}" != "-c" ; then 
  2092.   echo shar: Will not clobber existing file \"'screen.40'\"
  2093. else
  2094. echo shar: Extracting \"'screen.40'\" \(248 characters\)
  2095. sed "s/^X//" >'screen.40' <<'END_OF_FILE'
  2096. X    ############
  2097. X    #          ##
  2098. X    #  # #$$ $  #
  2099. X    #$ #$#  ## @#
  2100. X   ## ## # $ # ##
  2101. X   #   $ #$  # #
  2102. X   #   # $   # #
  2103. X   ## $ $   ## #
  2104. X   #  #  ##  $ #
  2105. X   #    ## $$# #
  2106. X######$$   #   #
  2107. X#....#  ########
  2108. X#.#... ##
  2109. X#....   #
  2110. X#....   #
  2111. X#########
  2112. END_OF_FILE
  2113. if test 248 -ne `wc -c <'screen.40'`; then
  2114.     echo shar: \"'screen.40'\" unpacked with wrong size!
  2115. fi
  2116. # end of 'screen.40'
  2117. fi
  2118. if test -f 'screen.41' -a "${1}" != "-c" ; then 
  2119.   echo shar: Will not clobber existing file \"'screen.41'\"
  2120. else
  2121. echo shar: Extracting \"'screen.41'\" \(286 characters\)
  2122. sed "s/^X//" >'screen.41' <<'END_OF_FILE'
  2123. X           #####
  2124. X          ##   ##
  2125. X         ##     #
  2126. X        ##  $$  #
  2127. X       ## $$  $ #
  2128. X       # $    $ #
  2129. X####   #   $$ #####
  2130. X#  ######## ##    #
  2131. X#.            $$$@#
  2132. X#.# ####### ##   ##
  2133. X#.# #######. #$ $##
  2134. X#........... #    #
  2135. X##############  $ #
  2136. X             ##  ##
  2137. X              ####
  2138. END_OF_FILE
  2139. if test 286 -ne `wc -c <'screen.41'`; then
  2140.     echo shar: \"'screen.41'\" unpacked with wrong size!
  2141. fi
  2142. # end of 'screen.41'
  2143. fi
  2144. if test -f 'screen.42' -a "${1}" != "-c" ; then 
  2145.   echo shar: Will not clobber existing file \"'screen.42'\"
  2146. else
  2147. echo shar: Extracting \"'screen.42'\" \(233 characters\)
  2148. sed "s/^X//" >'screen.42' <<'END_OF_FILE'
  2149. X     ########
  2150. X  ####      ######
  2151. X  #    ## $ $   @#
  2152. X  # ## ##$#$ $ $##
  2153. X### ......#  $$ ##
  2154. X#   ......#  #   #
  2155. X# # ......#$  $  #
  2156. X# #$...... $$# $ #
  2157. X#   ### ###$  $ ##
  2158. X###  $  $  $  $ #
  2159. X  #  $  $  $  $ #
  2160. X  ######   ######
  2161. X       #####
  2162. END_OF_FILE
  2163. if test 233 -ne `wc -c <'screen.42'`; then
  2164.     echo shar: \"'screen.42'\" unpacked with wrong size!
  2165. fi
  2166. # end of 'screen.42'
  2167. fi
  2168. if test -f 'screen.5' -a "${1}" != "-c" ; then 
  2169.   echo shar: Will not clobber existing file \"'screen.5'\"
  2170. else
  2171. echo shar: Extracting \"'screen.5'\" \(223 characters\)
  2172. sed "s/^X//" >'screen.5' <<'END_OF_FILE'
  2173. X        #####
  2174. X        #   #####
  2175. X        # #$##  #
  2176. X        #     $ #
  2177. X######### ###   #
  2178. X#....  ## $  $###
  2179. X#....    $ $$ ##
  2180. X#....  ##$  $ @#
  2181. X#########  $  ##
  2182. X        # $ $  #
  2183. X        ### ## #
  2184. X          #    #
  2185. X          ######
  2186. END_OF_FILE
  2187. if test 223 -ne `wc -c <'screen.5'`; then
  2188.     echo shar: \"'screen.5'\" unpacked with wrong size!
  2189. fi
  2190. # end of 'screen.5'
  2191. fi
  2192. if test -f 'screen.6' -a "${1}" != "-c" ; then 
  2193.   echo shar: Will not clobber existing file \"'screen.6'\"
  2194. else
  2195. echo shar: Extracting \"'screen.6'\" \(142 characters\)
  2196. sed "s/^X//" >'screen.6' <<'END_OF_FILE'
  2197. X######  ###
  2198. X#..  # ##@##
  2199. X#..  ###   #
  2200. X#..     $$ #
  2201. X#..  # # $ #
  2202. X#..### # $ #
  2203. X#### $ #$  #
  2204. X   #  $# $ #
  2205. X   # $  $  #
  2206. X   #  ##   #
  2207. X   #########
  2208. END_OF_FILE
  2209. if test 142 -ne `wc -c <'screen.6'`; then
  2210.     echo shar: \"'screen.6'\" unpacked with wrong size!
  2211. fi
  2212. # end of 'screen.6'
  2213. fi
  2214. if test -f 'screen.7' -a "${1}" != "-c" ; then 
  2215.   echo shar: Will not clobber existing file \"'screen.7'\"
  2216. else
  2217. echo shar: Extracting \"'screen.7'\" \(153 characters\)
  2218. sed "s/^X//" >'screen.7' <<'END_OF_FILE'
  2219. X       #####
  2220. X #######   ##
  2221. X## # @## $$ #
  2222. X#    $      #
  2223. X#  $  ###   #
  2224. X### #####$###
  2225. X# $  ### ..#
  2226. X# $ $ $ ...#
  2227. X#    ###...#
  2228. X# $$ # #...#
  2229. X#  ### #####
  2230. X####
  2231. END_OF_FILE
  2232. if test 153 -ne `wc -c <'screen.7'`; then
  2233.     echo shar: \"'screen.7'\" unpacked with wrong size!
  2234. fi
  2235. # end of 'screen.7'
  2236. fi
  2237. if test -f 'screen.8' -a "${1}" != "-c" ; then 
  2238.   echo shar: Will not clobber existing file \"'screen.8'\"
  2239. else
  2240. echo shar: Extracting \"'screen.8'\" \(226 characters\)
  2241. sed "s/^X//" >'screen.8' <<'END_OF_FILE'
  2242. X  ####
  2243. X  #  ###########
  2244. X  #    $   $ $ #
  2245. X  # $# $ #  $  #
  2246. X  #  $ $  #    #
  2247. X### $# #  #### #
  2248. X#@#$ $ $  ##   #
  2249. X#    $ #$#   # #
  2250. X#   $    $ $ $ #
  2251. X ####  #########
  2252. X  #      #
  2253. X  #      #
  2254. X  #......#
  2255. X  #......#
  2256. X  #......#
  2257. X  ########
  2258. END_OF_FILE
  2259. if test 226 -ne `wc -c <'screen.8'`; then
  2260.     echo shar: \"'screen.8'\" unpacked with wrong size!
  2261. fi
  2262. # end of 'screen.8'
  2263. fi
  2264. if test -f 'screen.9' -a "${1}" != "-c" ; then 
  2265.   echo shar: Will not clobber existing file \"'screen.9'\"
  2266. else
  2267. echo shar: Extracting \"'screen.9'\" \(240 characters\)
  2268. sed "s/^X//" >'screen.9' <<'END_OF_FILE'
  2269. X          #######
  2270. X          #  ...#
  2271. X      #####  ...#
  2272. X      #      . .#
  2273. X      #  ##  ...#
  2274. X      ## ##  ...#
  2275. X     ### ########
  2276. X     # $$$ ##
  2277. X #####  $ $ #####
  2278. X##   #$ $   #   #
  2279. X#@ $  $    $  $ #
  2280. X###### $$ $ #####
  2281. X     #      #
  2282. X     ########
  2283. END_OF_FILE
  2284. if test 240 -ne `wc -c <'screen.9'`; then
  2285.     echo shar: \"'screen.9'\" unpacked with wrong size!
  2286. fi
  2287. # end of 'screen.9'
  2288. fi
  2289. echo shar: End of shell archive.
  2290. exit 0
  2291.